#pragma once

struct CSevenZipTransferSource : CComObjectRootEx<CComSingleThreadModel>,
	                             ITransferSource
{
	DECLARE_NO_REGISTRY();
	DECLARE_NOT_AGGREGATABLE(CSevenZipTransferSource);

	BEGIN_COM_MAP(CSevenZipTransferSource)
		COM_INTERFACE_ENTRY(ITransferSource)
	END_COM_MAP()

	IFACEMETHODIMP Advise(__in ITransferAdviseSink *, __out PDWORD) PURE;

	IFACEMETHODIMP Unadvise(__in DWORD) PURE;

	IFACEMETHODIMP SetProperties(__in IPropertyChangeArray *) PURE;

	IFACEMETHODIMP OpenItem(__in IShellItem *, 
		                    __in DWORD,
							__in REFIID,
							__deref_out PVOID *) PURE;

	IFACEMETHODIMP MoveItem(__in IShellItem *,
		                    __in IShellItem *,
							__in LPCWSTR,
							__in DWORD,
							__deref_out IShellItem **) PURE;

	IFACEMETHODIMP RecycleItem(__in IShellItem *,
		                       __in IShellItem *,
							   __in DWORD,
							   __deref_out IShellItem **) PURE;

	IFACEMETHODIMP RemoveItem(__in IShellItem *, __in DWORD) PURE;

	IFACEMETHODIMP RenameItem(__in IShellItem *,
		                      __in LPCWSTR,
							  __in DWORD,
							  __deref_out  IShellItem **) PURE;

	IFACEMETHODIMP LinkItem(__in IShellItem *,
		                    __in IShellItem *,
							__in_opt LPCWSTR,
							__in DWORD,
							__deref_out IShellItem **) PURE;

	IFACEMETHODIMP ApplyPropertiesToItem(__in IShellItem *,
		                                 __deref_out IShellItem **) PURE;

	IFACEMETHODIMP GetDefaultDestinationName(__in IShellItem *,
		                                     __in IShellItem *,
											 __deref_out LPWSTR *) PURE;

	IFACEMETHODIMP EnterFolder(__in IShellItem *) PURE;

	IFACEMETHODIMP LeaveFolder(__in IShellItem *) PURE;
};